/**
 * 
 */
package com.infoland.modules.main.service;

import java.util.List;

import com.alibaba.fastjson.JSONArray;
import com.infoland.modules.basic.Message;
import com.infoland.modules.main.controller.AdminController;
import com.infoland.modules.main.controller.PermissionController;
import com.infoland.modules.main.controller.RoleController;
import com.infoland.modules.main.model.Admin;
import com.infoland.modules.main.model.AdminLog;
import com.infoland.modules.main.model.Icon;
import com.infoland.modules.main.model.Menu;
import com.infoland.modules.main.model.Permission;
import com.infoland.modules.main.model.Role;
import com.infoland.modules.main.service.impl.SystemServiceImpl;
import com.jfinal.aop.Duang;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;

/**
 * @author Mandarava
 *
 */
public interface SystemService {

	public static final SystemService service = Duang.duang(SystemServiceImpl.class);

	public Message login(Controller controller);

	public void logout();

	public Admin findAdminByName(String userName);

	public List<String> getAdminRoles(Admin admin);

	public List<String> getAdminPermissions(Admin admin);

	public List<Menu> getAdminResouce();
	

	public Page<Admin> findAdminByPage(AdminController controller);
	/**
	 * @author lixp
	 * 查询所有图标
	 * @return
	 */
	public List<Icon> findIcon();

	/**
	 * 保存后台管理员用户
	 * 
	 * @author Mandarava
	 * @param controller
	 * @return
	 */
	public Message saveAdmin(JSONArray roleIds, Admin admin);

	/**
	 * 执行修改后台用户
	 * 
	 * @author Mandarava
	 * @param controller
	 * @return
	 */
	public Message updateAdmin(Admin admin, JSONArray roleIds);

	/**
	 * 根据ID查询后台用户
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Admin findOneAdmin(Long id);

	/**
	 * 删除后台用户(批量)
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Message deleteAdmin(JSONArray ids);

	/**
	 * 注销后台用户
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Message writtenOffAdmin(Long id);

	/**
	 * 恢复后台用户，将用户状态置为可用状态 a_status = 0 a_status_v = '可用'
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Message resumedAdmin(Long id);

	public List<Role> findRole();


	/**
	 * 分页查询角色
	 * 
	 * @author Mandarava
	 * @param controller
	 * @return
	 */
	public Page<Role> findRoleByPage(RoleController controller);

	/**
	 * 根据id查询一个角色
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Role findOneRole(Long id);

	/**
	 * 新增一个角色
	 * 
	 * @author Mandarava
	 * @param role
	 * @return
	 */
	public Message saveRole(Role role);

	/**
	 * 修改一个角色
	 * 
	 * @author Mandarava
	 * @param role
	 * @return
	 */
	public Message updateRole(Role role);

	/**
	 * 批量删除角色
	 * 
	 * @author Mandarava
	 * @param ids
	 * @return
	 */
	public Message batchDelRole(Integer[] ids);

	/**
	 * 查询全部菜单
	 * 
	 * @author Mandarava
	 * @return
	 */
	public List<Menu> finAllMenus();

	/**
	 * 根据ID查询一个ID
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Menu findOneMenu(Integer id);

	/**
	 * 执行新增菜单
	 * 
	 * @author Mandarava
	 * @param menus
	 * @return
	 */
	public Message saveMenu(Menu menus);

	/**
	 * 执行修改菜单
	 * 
	 * @author Mandarava
	 * @param menus
	 * @return
	 */
	public Message updateMenu(Menu menus);

	/**
	 * 根据ID删除菜单
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Message deleteMenu(Integer id);

	/**
	 * 分页查询操作权限信息 可根据【权限名称】、【权限标识】、【操作路径】进行模糊查询
	 * 
	 * @author Mandarava
	 * @param controller
	 * @return
	 */
	public Page<Permission> findPermissionByPage(PermissionController controller);

	/**
	 * 批量新增权限信息，需在实现类中循环设置ID
	 * 
	 * @author Mandarava
	 * @param modelList
	 * @return
	 */
	public Message batchSavePermission(List<Permission> modelList);

	/**
	 * 根据ID查询权限信息
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Permission findOnePermission(Long id);

	/**
	 * <p>
	 * 根据ID删除权限信息
	 * </p>
	 * 验证条件：已和角色关联，不可删除。
	 * 
	 * @author Mandarava
	 * @param id
	 * @return
	 */
	public Message deletePermission(Long id);

	/**
	 * 更新权限信息
	 * 
	 * @author Mandarava
	 * @param model
	 * @return
	 */
	public Message updatePermission(Permission model);

	/**
	 * 查询可授权集合
	 * 
	 * @author Mandarava
	 * @return
	 */
	public List<Menu> authorityList();

	/**
	 * 为角色授权
	 * 
	 * @author lixp           
	 * @param roleId            角色id
	 * @param menuIds			选择的菜单
	 * @param permissionIds		选择的权限
	 * @return					授权成功与否的信息
	 */
	public Message authority(Long roleId, JSONArray menuIds, JSONArray permissionIds);

	/**
	 * 查询所有的菜单
	 * 
	 * @author fast_ly
	 * @time:2016年8月29日 上午11:29:24
	 */
	public List<Menu> findMens();

	public List<Record> menusRoleList(Long roleId);

	public List<Record> permissionRoleList(Integer roleId);

	Message saveAdminLog(AdminLog al);

	List<Role> findAllRole();
	/**
	 * 增加权限数据
	 * @author lixp
	 * @param model   permission对象
	 * @return        储存成功与否的信息
	 */
	Message savePermission(Permission model);
	/**
	 * 根据菜单id获取权限列表
	 * @author lixp
	 * @param menuId  菜单id
	 * @return        权限列表
	 */
	List<Permission> permissionMenuList(Long menuId);
}
